package com.practice.util;

import com.practice.response.ResponseEnum;
import com.practice.response.ResponseR;
import lombok.experimental.UtilityClass;

/**
 * 对统一响应实体的操作工具
 * 使用这个可以避免业务代码里出现大量的类型检查警告
 *
 * @see ResponseR
 */
@UtilityClass
public class ResponseRUtil {

    /**
     * 返回一个 OK 数据
     *
     * @param message 提示信息
     * @param data    响应数据
     */
    public static <T> ResponseR<T> ok(String message, T data) {
        return ResponseR.ok().message(message).data(data);
    }

    /**
     * 返回一个 OK 数据,默认提示信息
     *
     * @param data 响应数据
     */
    public static <T> ResponseR<T> ok(T data) {
        return ResponseR.ok().message(ResponseEnum.SUCCESS.getMessage()).data(data);
    }

    /**
     * 返回一个 OK 数据
     *
     * @param message 提示信息
     */
    public static <T> ResponseR<T> ok(String message) {
        return ResponseR.ok().message(message).data(message);
    }

    /**
     * 返回一个不 OK 数据,自定义提示信息,并且可以输出异常堆栈
     *
     * @param message         自定义提示信息
     * @param exceptionPrefix 输出异常堆栈定位前缀
     * @param e               异常
     */
    public static <T> ResponseR<T> error(String message, String exceptionPrefix, Exception e) {
        return ResponseR.error().message(message);
    }

    /**
     * 返回一个不 OK 数据,提示信息使用异常 message,并且可以输出异常堆栈
     *
     * @param exceptionPrefix 输出异常堆栈定位前缀
     * @param e               异常
     */
    public static <T> ResponseR<T> error(String exceptionPrefix, Exception e) {

        return ResponseR.error().message(exceptionPrefix + "," + e.getMessage());
    }

    /**
     * 返回一个不 OK 数据,提示信息使用异常 message
     *
     * @param message 自定义提示信息
     */
    public static <T> ResponseR<T> error(String message) {
        return ResponseR.error().message(message);
    }

    /**
     * 返回一个不 OK 数据,提示信息使用异常 message,并且打印异常堆栈
     *
     * @param e 异常
     */
    public static <T> ResponseR<T> error(Exception e) {
        return ResponseR.error().message(e.getMessage());
    }

    public static <T> T getDataRequired(ResponseR<T> response) {
        if (response == null) {
            throw new RuntimeException("响应实体为空");
        }
        if (response.getSuccess() == null || !response.getSuccess()) {
            throw new RuntimeException("响应失败," + response.getMessage());
        }
        T data = response.getData();
        if (data == null) {
            throw new RuntimeException("响应实体承载数据为空");
        }
        return data;
    }

    public static <T> T getDataOrDefault(ResponseR<T> response, T instance) {
        if (response == null) {
            return instance;
        }
        if (response.getSuccess() == null || !response.getSuccess()) {
            return instance;
        }
        T data = response.getData();
        if (data == null) {
            return instance;
        }
        return data;
    }

    public static <T> T getData(ResponseR<T> response) {
        if (response == null) {
            throw new RuntimeException("响应实体为空");
        }
        if (response.getSuccess() == null || !response.getSuccess()) {
            throw new RuntimeException("响应失败," + response.getMessage());
        }
        return response.getData();
    }

    public static String getMessage(ResponseR responseR) {
        if (responseR == null) {
            return "";
        }
        return responseR.getMessage();
    }
}
